<?php

class Encabezado
{
    /**
     * Indica que es un registro de encabezado
     */
    const TIPO = 'H';
    const ACCION_INCLUSIVO = '0';
    const ACCION_REEMPLAZO = '1';
    const ESTATUS_ENVIADO_POR_EMISOR = '00';

    /**
     * Fijo=H  Indica que es un Header
     * @var string
     */
    private $tipo;

    /**
     * Número de Emisor que le asignó Banorte
     * @var integer
     */
    private $emisor;

    /**
     * Fecha en la que se transmite el archivo.
     * 8 caracteres de longitud en formato YYYYmmdd
     * @var string 
     */
    private $fecha;

    /**
     * Número de Afiliaciones Enviadas
     * @var integer 
     */
    private $totalAfiliaciones;

    /**
     * Indica el tipo de procesamiento 0=inclusivo y 1=reemplazo
     * @var integer 
     */
    private $accion;

    /**
     * 00 Cuando es enviado por el Emisor
     * @var integer 
     */
    private $estatus;
    private $header;

    public function __construct($emisor, $fecha, $totalAfiliaciones) {
        $this->tipo = self::TIPO;
        $this->emisor = $emisor;
        $this->fecha = $fecha;
        $this->totalAfiliaciones = $totalAfiliaciones;
        $this->accion = self::ACCION_INCLUSIVO;
        $this->estatus = self::ESTATUS_ENVIADO_POR_EMISOR;
        $this->header = null;
    }

    public function getString() {
        if ($this->header === null) {
            $parts = array();
            $parts[] = $this->tipo;
            $parts[] = $this->getEmisor();
            $parts[] = $this->getFecha();
            $parts[] = $this->getTotalAfiliaciones();
            $parts[] = (string)$this->accion;
            $parts[] = (string)$this->estatus;
            $parts[] = $this->getFiller();
            $this->header = implode('', $parts);
        }
        return $this->header;
    }

    private function getEmisor() {
        if ($this->emisor > 99999 || $this->emisor <= 0) {
            throw new Exception('Número de emisor incorrecto. Debe ser númerico de 5'
            . 'caracteres.');
        }
        return str_pad($this->emisor, 5, '0', STR_PAD_LEFT);
    }

    private function getFecha() {
        return $this->fecha;
    }

    private function getTotalAfiliaciones() {
        if ($this->totalAfiliaciones > 999999 || $this->totalAfiliaciones <= 0) {
            throw new Exception('Número de total de afiliaciones es incorrecto. Debe ser númerico menor o igual a 999999');
        }
        return str_pad($this->totalAfiliaciones, 6, '0', STR_PAD_LEFT);
    }

    private function getFiller() {
        return str_pad(' ', 157);
    }

}
